package com.janetfilter.core.plugin;

import java.security.ProtectionDomain;

/**
 * 自定义转换器接口，插件通过实现此接口来提供字节码转换功能
 * 
 * 转换器有两种类型：
 * 1. 普通转换器：通过getHookClassName返回特定类名，只处理该类
 * 2. 全局转换器：getHookClassName返回null，处理所有类
 * 
 * 转换生命周期：before -> preTransform -> transform -> postTransform -> after
 */
public interface MyTransformer {
    /**
     * 获取要转换的类名
     * 
     * @return 类名格式为"package/to/className"，返回null表示这是一个全局转换器
     */
    String getHookClassName();

    /**
     * 是否在Attach模式下加载此转换器
     * 
     * @return 默认返回true，表示在Attach模式下加载
     */
    default boolean attachMode() {
        return true;
    }

    /**
     * 是否在Java Agent模式下加载此转换器
     * 
     * @return 默认返回true，表示在Java Agent模式下加载
     */
    default boolean javaagentMode() {
        return true;
    }

    /**
     * 仅适用于全局转换器
     * 是否是管理型转换器，管理型转换器会处理所有类的转换
     * 
     * @return 返回true表示这是一个管理型转换器
     */
    default boolean isManager() {
        return false;
    }

    /**
     * 仅适用于全局转换器
     * 在转换前调用，可以进行一些准备工作
     * 
     * @param loader 类加载器
     * @param classBeingRedefined 被重定义的类
     * @param protectionDomain 保护域
     * @param className 类名
     * @param classBytes 类字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default void before(ClassLoader loader, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, String className, byte[] classBytes) throws Exception {
        before(className, classBytes);
    }

    /**
     * 仅适用于全局转换器
     * 在转换前调用，简化版本
     * 
     * @param className 类名
     * @param classBytes 类字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default void before(String className, byte[] classBytes) throws Exception {

    }

    /**
     * 仅适用于全局转换器
     * 转换前的预处理，返回处理后的字节码
     * 
     * @param loader 类加载器
     * @param classBeingRedefined 被重定义的类
     * @param protectionDomain 保护域
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] preTransform(ClassLoader loader, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, String className, byte[] classBytes, int order) throws Exception {
        return preTransform(className, classBytes, order);
    }

    /**
     * 仅适用于全局转换器
     * 转换前的预处理，简化版本
     * 
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] preTransform(String className, byte[] classBytes, int order) throws Exception {
        return transform(className, classBytes, order);     // 为了兼容旧版本
    }

    /**
     * 仅适用于普通转换器
     * 主要的转换方法，执行字节码修改，返回修改后的字节码
     * 
     * @param loader 类加载器
     * @param classBeingRedefined 被重定义的类
     * @param protectionDomain 保护域
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] transform(ClassLoader loader, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, String className, byte[] classBytes, int order) throws Exception {
        return transform(className, classBytes, order);
    }

    /**
     * 仅适用于普通转换器
     * 主要的转换方法，简化版本
     * 
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] transform(String className, byte[] classBytes, int order) throws Exception {
        return classBytes;
    }

    /**
     * 仅适用于全局转换器
     * 转换后的后处理，执行字节码的最终修改
     * 
     * @param loader 类加载器
     * @param classBeingRedefined 被重定义的类
     * @param protectionDomain 保护域
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] postTransform(ClassLoader loader, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, String className, byte[] classBytes, int order) throws Exception {
        return postTransform(className, classBytes, order);
    }

    /**
     * 仅适用于全局转换器
     * 转换后的后处理，简化版本
     * 
     * @param className 类名
     * @param classBytes 类字节码
     * @param order 转换顺序
     * @return 处理后的字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default byte[] postTransform(String className, byte[] classBytes, int order) throws Exception {
        return classBytes;
    }

    /**
     * 仅适用于全局转换器
     * 转换完成后调用，可以进行一些清理工作
     * 
     * @param loader 类加载器
     * @param classBeingRedefined 被重定义的类
     * @param protectionDomain 保护域
     * @param className 类名
     * @param classBytes 类字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default void after(ClassLoader loader, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, String className, byte[] classBytes) throws Exception {
        after(className, classBytes);
    }

    /**
     * 仅适用于全局转换器
     * 转换完成后调用，简化版本
     * 
     * @param className 类名
     * @param classBytes 类字节码
     * @throws Exception 如果处理过程中发生异常
     */
    default void after(String className, byte[] classBytes) throws Exception {

    }
}
